package com.example.lt.controller;

import com.example.lt.constant.MessageConstant;
import com.example.lt.pojo.entity.Song;
import com.example.lt.pojo.vo.SongVO;
import com.example.lt.result.Result;
import com.example.lt.service.SongService;
import jdk.jfr.FlightRecorder;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.util.ArrayList;
import java.util.List;

/**
 * @Author 小涛Tao
 * @Date: 2024/06/02/19:46
 * version 1.0 注释：
 **/
@Slf4j
@RestController
@RequiredArgsConstructor
@RequestMapping("/song")
public class SongController {

    private final SongService songService;

    /**
     * 管理端添加新歌曲
     * @param
     * @return
     */
    @PostMapping("/admin/add")
    public Result addSong(
            @RequestParam("singerId") Integer id,
            @RequestParam("name") String name,
            @RequestParam("lyric") String lyric,
            @RequestParam("introduction") String introduction,
            @RequestParam("lrcFile") MultipartFile lrcFile, @RequestParam("file") MultipartFile songFile) {
        Song song = Song.builder()
                .singerId(id)
                .name(name)
                .lyric(lyric)
                .introduction(introduction).build();
        log.info("管理端添加新歌曲：{}",song);

        return songService.addSong(song, lrcFile, songFile);
    }

    /**
     * 管理端更新歌曲信息
     * @param song
     * @return
     */
    @PostMapping("/admin/update")
    public Result updateSongMsg(@RequestBody Song song)  {
        log.info("管理端更新歌曲信息：{}",song);
        boolean flag = songService.updateById(song); // 更新歌曲信息
        if (flag) {
            return Result.success(MessageConstant.ALTER_SUCCESS);
        } else {
            return Result.error(MessageConstant.ALTER_FAIL);
        }
    }

    /**
     * 管理端更新歌曲的音频
     * @param urlFile
     * @param id
     * @return
     */
    @PostMapping("/admin/updateUrl")
    public Result updateSongUrl(@RequestParam("file") MultipartFile urlFile, @RequestParam("id") int id) {
        log.info("管理端更新歌曲的音频：{}", id);
        return songService.updateSongUrl(urlFile,id);
    }

    /**
     * 管理端更新歌曲的图片
     * @param imgFile
     * @param id
     * @return
     */
    @PostMapping("/admin/updateImg")
    public Result updateSongImg(@RequestParam("file") MultipartFile imgFile, @RequestParam("id") int id) {
        log.info("管理端更新歌曲的图片：{}",id);
        return songService.updateSongImg(imgFile, id);
    }

    /**
     * 管理端更新歌曲歌词
     * @param lrcFile
     * @param id
     * @return
     */
    @PostMapping("/admin/updateLrc")
    public Result updateSongLrc(@RequestParam("file") MultipartFile lrcFile, @RequestParam("id") int id) {
        log.info("管理端更新歌曲的歌词：{}", id);
        return songService.updateSongLrc(lrcFile, id);
    }

    /**
     * 管理端删除歌曲
     * @param id
     * @return
     */
    @DeleteMapping("/admin/delete")
    public Result deleteSong(@RequestParam int id) {
        log.info("管理端删除歌曲");
        return songService.deleteSong(id);
    }

    /**
     * 获取歌曲总数，目前只有管理端调用这个方法
     * @return
     */
    @GetMapping("/common/getCount")
    public Result getSongCount() {
        log.info("管理端获取歌曲总数");
        long songCount = songService.count();
        return Result.success(songCount);
    }

    /**
     * 根据歌曲id获取歌曲信息
     * @param id
     * @return
     */
    @GetMapping("/common/detail")
    public Result<List<SongVO>> getSongById(@RequestParam int id) {
        log.info("获取歌曲信息：{}",id);
        List<SongVO> songs = songService.getSongById(id);
        return Result.success(songs);
    }

    /**
     * 根据歌手id获取歌曲
     * @param singerId
     * @return
     */
    @GetMapping("/common/singerId")
    public Result<List<SongVO>> getSongBySingId(@RequestParam Integer singerId) {
        log.info("根据歌手id获取歌曲：{}",singerId);
        List<SongVO> songVOList = songService.getSongBySingId(singerId);
        return Result.success(songVOList);
    }

    /**
     * 根据歌曲名和歌手名来进行模糊查询歌曲信息
     * @return
     */
    @GetMapping("/common/singerName")
    public Result<List<SongVO>> getSongLikeName(@RequestParam String name) {
        log.info("查询歌曲名或歌手名中有关键词的歌曲信息：{}",name);
        return songService.getSongLikeName(name);
    }

}
